#include "../header.h"
#include "cJSON.h"

//想要传递的任何数据，格式做好。
// {
//      "name" : "jack",
//       "code" : 12345,
//      "info" : "hello" ,
//      "sign" : "all is well",
//      "fuhao" : ">"
// }

//1.socket : 建立套接字
//2.connect : 链接 服务端。
//3. 读写: send/recv
//4.关闭  close shudown(cid,SHUT_RDWR);
/**
 * @函数原型:  int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
 * @函数功能:  与一个已经存在的套接字进行连接
 * @参数说明: 
 * @       参数1: sockfd : 套接字
 * @       参数2: const struct sockaddr *addr : 服务端的地址结构体。
 * @       参数3: addrlen : 地址长度
 * @返回值: 成功返回0 失败返回-1；
 * @param {int} argc
 */
int main(int argc, char const *argv[])
{
    if(argc < 3)
    {
        perror("argc error\n");
        return -1;
    }
    //建立客户端套接字
    int cid = socket(AF_INET,SOCK_STREAM,0);
    printf("cid = %d\n",cid);

    //connect
    struct sockaddr_in caddr = {0};
    caddr.sin_family = AF_INET;
    caddr.sin_port = htons(atoi(argv[2]));
    caddr.sin_addr.s_addr = inet_addr(argv[1]);
    if(connect(cid,(struct sockaddr*)&caddr,sizeof(caddr)) < 0 )
    {
        perror("connect error\n");
        return -3;
    }
    printf("connect successful\n");

    char bufs[128] = "";
    char bufn[128] = "";
    char bufm[128] = "";
    int len = 0 ;
    //json的数据封装。
    //------------------------------------------------------//
    cJSON * json_pointer = NULL;
    //创建一个链表数据对象。
    json_pointer = cJSON_CreateObject();
    //1添加字符串类型到节点当中 姓名
    cJSON_AddStringToObject(json_pointer,"name","jack");
    //2 添加整型数据 密码
    cJSON_AddNumberToObject(json_pointer,"code",12345);
    //3 添加字符串类型到节点当中 信息
    //cJSON_AddStringToObject(json_pointer,"info","hello linux");
    //4 添加字符串类型到节点当中 签名
    cJSON_AddStringToObject(json_pointer,"sign","all is well");
    //添加字符串类型到节点当中 
    cJSON_AddStringToObject(json_pointer,"fuhao",">");
    //数据整理
    char * str = NULL ; 

    //信息节点
    cJSON * json_info = NULL;

    //循环读写
    while(1)
    {
        bzero(bufs,sizeof(bufs));
        //先写 - 从键盘读数据再写给对面
        read(STDIN_FILENO,bufs,sizeof(bufs)-1);   
        cJSON_AddStringToObject(json_pointer,"info",bufs);
        //jason格式转换成字符串格式
        str = cJSON_Print(json_pointer);
        send(cid,str,strlen(str),0);
        //发送过去之后，进行删除节点。
        cJSON_DeleteItemFromObject(json_pointer, "info");
    }
    //
    shutdown(cid,SHUT_RDWR);

    return 0;
}
